package userTeam

import (
	"autoDeploy/service/email"
	"autoDeploy/service/team"
	"errors"
	"fmt"
	"github.com/gin-gonic/gin"
	"github.com/golang-jwt/jwt"
	"strconv"
)

type Team struct{}

//	AddUserTeam
//
// 描述信息：添加用户团队
//
// Param：
//
//	c ：
//
// Return：
func (t Team) AddUserTeam(c *gin.Context) {

	// 从上下文中获取所有的 Claims 信息
	claims, _ := c.Get("claims")
	if claims != nil {
		// 将 Claims 转换为 jwt.MapClaims
		claimsMap := claims.(jwt.MapClaims)

		// 解析 JSON 格式的请求体
		var data struct {
			TeamName string `json:"team_name"`
			Address  string `json:"address"`
		}
		if err := c.ShouldBindJSON(&data); err != nil {
			c.JSON(200, gin.H{"code": -1, "message": "Invalid request data"})
			return
		}
		if data.TeamName == "" || data.Address == "" {
			c.JSON(200, gin.H{"code": -1, "message": "Invalid request data"})
			return
		}

		teamName := data.TeamName
		address := data.Address
		captainUserIdFloat := claimsMap["user_id"].(float64)
		captainUserId := uint64(int64(captainUserIdFloat))
		fmt.Println(address, captainUserId, teamName)

		//调用service方法,进行新建团队
		code, err := team.UserAddTeamToDB(teamName, captainUserId, address)
		if err != nil {
			c.JSON(200, gin.H{"code": code, "message": "新建团队失败了！！！"})
			return
		}
		c.JSON(200, gin.H{"code": code, "message": "新建团队成功"})
		return

	} else {
		c.JSON(500, gin.H{
			"code":    -1,
			"message": "Failed to get claims",
		})
		return
	}
}

//	InviteMember
//
// 描述信息： 邀请用户加入团队，发送信息
//
// Param：
//
//	c ：
//
// Return：
func (t Team) InviteMember(c *gin.Context) {
	claims, _ := c.Get("claims")
	if claims != nil {
		claimsMap := claims.(jwt.MapClaims)
		var data struct {
			TeamName   string `json:"team_name"`
			Phone      string `json:"phone"`
			WebHookURL string `json:"web_hook_url"`
			TeamID     uint64 `json:"team_id"`
		}
		if err := c.ShouldBindJSON(&data); err != nil {
			c.JSON(200, gin.H{"code": -1, "message": "Invalid request data"})
		}
		//解析参数 团队名，目标手机号，队长id
		teamName := data.TeamName
		phone := data.Phone
		webHookURL := data.WebHookURL
		teamId := data.TeamID
		captainUserIdFloat := claimsMap["user_id"].(float64)
		captainUserId := uint64(int64(captainUserIdFloat))

		//fmt.Println("解析到的队长id", captainUserId)
		//fmt.Println(teamName, phone, captainUserId, webHookURL)

		//调用service方法
		code, err := team.SendInvitation(teamName, captainUserId, phone, webHookURL, teamId)
		if err != nil {
			c.JSON(200, gin.H{"code": code, "message": err.Error()})
			return
		}

		c.JSON(200, gin.H{"code": code, "message": "邀请信息发送成功"})

	}
}

//	ManageTeam
//
// 描述信息： 管理团队，返回团队成员
//
// Param：
//
//	c ：
//
// Return：
func (t Team) ManageTeam(c *gin.Context) {
	//获取团队的ID
	teamIdStr := c.Query("team_id")
	if teamIdStr == "" {
		c.JSON(200, gin.H{"code": 0, "message": "查询参数错误"})
		return
	}
	// 将字符串转换为 uint64
	teamId, _ := strconv.ParseUint(teamIdStr, 10, 64)

	//调用service方法返回团队成员和项目信息
	num, member, project, err := team.GetTeamInfo(teamId)
	if err != nil {
		c.JSON(200, gin.H{"code": 0, "message": "获取团队成员信息和项目信息失败"})
		return
	}
	c.JSON(200, gin.H{"code": 1, "num": num, "member": member, "project": project})
	return
}

//	AddNewProject
//
// 描述信息： 添加新的项目
//
// Param：
//
//	c ：
//
// Return：状态码 -1：表示项目创建失败，0：表示团队项目记录创建失败，1：表示成功
func (t Team) AddNewProject(c *gin.Context) {
	var data struct {
		TeamID         uint64 `json:"team_id"`
		ProjectName    string `json:"project_name"`
		ProjectAddress string `json:"project_address"`
	}
	if err := c.ShouldBindJSON(&data); err != nil {
		c.JSON(200, gin.H{"code": -1, "message": "Invalid request data"})
		return
	}

	projectName := data.ProjectName
	projectAddress := data.ProjectAddress
	teamID := data.TeamID
	if projectName == "" || projectAddress == "" {
		c.JSON(200, gin.H{"code": -1, "message": "Invalid request data"})
		return
	}
	fmt.Println(projectName, projectAddress, teamID)
	//调用service层的方法
	code, err := team.AddProjectToTeam(teamID, projectAddress, projectName)
	if err != nil {
		c.JSON(200, gin.H{"code": code, "message": err.Error()})
		return
	}

	c.JSON(200, gin.H{"code": code, "message": "项目创建成功"})
	return
}

//	GetUserResource
//
// 描述信息：初始化加载页面，获取用户的团队以及团队成员角色详细信息
//
// Param：
//
//	c ：
//
// Return：
func (t Team) GetUserResource(c *gin.Context) {
	claims, _ := c.Get("claims")
	if claims != nil {
		claimsMap := claims.(jwt.MapClaims)
		//从token中获取用户id
		UserIdFloat := claimsMap["user_id"].(float64)
		UserId := uint64(int64(UserIdFloat))
		//调用service层的方法获得数据
		code, user, teams, err := team.GetUserResource(UserId)
		if err != nil {
			c.JSON(200, gin.H{"code": code, "message": err.Error()})
			return
		}
		c.JSON(200, gin.H{"code": code, "message": "获取信息成功", "user": user, "teams": teams})
	}
}

//	Agree
//
// 描述信息： 处理同意入队的请求
//
// Param：
//
//	c ：
//
// Return：
func (t Team) Agree(c *gin.Context) {
	var notification email.NotificationResponse
	if err := c.ShouldBindJSON(&notification); err != nil {
		c.JSON(200, gin.H{"code": 0, "message": "Invalid request data"})
		return
	}
	//调用service层的方法
	code, err := team.AgreeJoinTeam(notification.ReceiverID, notification.TeamID)
	if err != nil {
		c.JSON(200, gin.H{"code": code, "message": err.Error()})
		return
	}
	c.JSON(200, gin.H{"code": code, "message": "加入团队成功"})
	return
}

//	Drop
//
// 描述信息： 根据用户id团队id，踢出团队成员
//
// Param：
//
//	c ：
//
// Return：
func (t Team) Drop(c *gin.Context) {
	var data struct {
		TeamID uint64 `json:"team_id"`
		UserID uint64 `json:"user_id"`
	}
	if err := c.ShouldBindJSON(&data); err != nil {
		c.JSON(200, gin.H{"code": 0, "message": "Invalid request data"})
		return
	}
	//调用service层的方法进行踢出操作
	err := team.DropMember(data.UserID, data.TeamID)
	if err != nil {
		c.JSON(200, gin.H{"code": 0, "message": errors.New("controller Drop 调用service层的方法进行踢出操作失败" + err.Error())})
		return
	}
	c.JSON(200, gin.H{"code": 1, "message": "移除成员成功"})
	return
}

func (t Team) GetTeamSum(c *gin.Context) {
	claims, _ := c.Get("claims")
	if claims != nil {
		claimsMap := claims.(jwt.MapClaims)
		UserIdFloat := claimsMap["user_id"].(float64)
		UserId := uint64(int64(UserIdFloat))
		//调用service层的方法
		sum, err := team.GetTeamSum(UserId)
		if err != nil {
			c.JSON(200, gin.H{"code": 0, "sum": 0, "message": err.Error()})
			return
		}
		c.JSON(200, gin.H{"code": 1, "sum": sum, "message": "查询成功"})
		return
	}
}
